package main

import "fmt"

//结构体定义
// type struct_variable_type struct {
// 	member definition;
// 	member definition;
// 	...
// 	member definition;
//  }
// type Person struct {
// 	id    int
// 	name  string
// 	age   int
// 	email string
// }
//  type Person struct{
//    id ,age int
//    name ,email string
//  }
// func main() {
// 	var tom Person
// 	fmt.Printf("tom: %v\n", tom) //tom: {0  0 }
// 	tom.id = 1
// 	tom.name = "tom"
// 	tom.age = 20
// 	tom.email = "tom@gmail.com"
// 	fmt.Printf("tom: %v\n", tom) //tom: {1 tom 20 tom@gmail.com}
// 	kite := Person{}
// 	fmt.Printf("kite: %v\n", kite) //kite: {0  0 }
// }
//匿名结构体  - 临时使用
// func main() {
// 	var dog struct {
// 		id   int
// 		name string
// 	}
// 	dog.id = 1
// 	dog.name = "滑滑"
// 	fmt.Printf("dog: %v\n", dog) //dog: {1 滑滑}
// }

//结构体的初始化
// func main() {
// 	type Person struct {
// 		id, age     int
// 		name, email string
// 	}
// 	var tom Person
// 	fmt.Printf("tom: %v\n", tom) //tom: {0 0  }
// 	//使用键值对初始化
// 	kite := Person{
// 		id:    1,
// 		age:   20,
// 		name:  "kite",
// 		email: "kite@gmail.com",
// 	}
// 	fmt.Printf("kite: %v\n", kite) //kite: {1 20 kite kite@gmail.com}
// 	//使用值的列表初始化
// 	tim := Person{
// 		101,
// 		20,
// 		"tim",
// 		"tim@gmail.com",
// 	}
// 	fmt.Printf("tim: %v\n", tim) //tim: {101 20 tim tim@gmail.com}
// 	//部分成员初始化 - 用不到的可以不进行初始化
// 	Kite := Person{
// 		id:   1,
// 		name: "kite",
// 	}
// 	fmt.Printf("Kite: %v\n", Kite) //Kite: {1 0 kite }
// }

//结构体指针
// func main() {
// 	//普通指针
// 	var name string
// 	name = "tom"
// 	var p_name *string
// 	p_name = &name
// 	fmt.Printf("name: %v\n", name) //name: tom
// 	fmt.Printf("p_name: %v\n", p_name) //p_name: 0xc00005e250
// 	fmt.Printf("p_name: %v\n", *p_name) //p_name: tom
// }
// func main() {
// 	type Person struct {
// 		id   int
// 		name string
// 	}
// 	var tom = Person{1, "tom"}

// 	var p_person *Person
// 	p_person = &tom
// 	fmt.Printf("tom: %v\n", tom) //tom: {1 tom}
// 	fmt.Printf("p_person: %p\n", p_person) //p_person: 0xc00008c060
// 	fmt.Printf("p_person: %v\n", *p_person) //p_person: {1 tom}
// }
//使用new关键字创建结构体指针
// func main() {
// 	type Person struct {
// 		id   int
// 		name string
// 	}
// 	var p_person = new(Person)             // 为指针类型
// 	fmt.Printf("p_person: %T\n", p_person) //p_person: *main.Person
// 	p_person.id = 1
// 	p_person.name = "tom"
// 	fmt.Printf("p_person: %v\n", *p_person)//p_person: {1 tom}
// }

//结构体作为函数参数
// 直接传递结构体，这是是一个副本（拷贝），在函数内部不会改变外面结构体内容。
// 传递结构体指针，这时在函数内部，能够改变外部结构体内容
//1.直接传递结构体
// type Person struct {
// 	id   int
// 	name string
// }

// func showPerson(person Person) {
// 	person.id = 1
// 	person.name = "kite"
// 	fmt.Printf("person: %v\n", person)
// }
// func main() {
// 	person := Person{1, "tom"}
// 	fmt.Printf("person: %v\n", person) //person: {1 tom}
// 	fmt.Println("--------------")
// 	showPerson(person) //person: {1 kite}
// 	fmt.Println("-------------")
// 	fmt.Printf("person: %v\n", person) //person: {1 tom}
// }

//2.传递结构体指针
// type Person struct {
// 	id   int
// 	name string
// }

// func showPerson(person *Person) {
// 	person.id = 1
// 	person.name = "kite"
// 	fmt.Printf("person: %v\n", person)
// }
// func main() {
// 	person := Person{1, "tom"}
// 	fmt.Printf("person: %v\n", person) //person: {1 tom}
// 	fmt.Println("--------------")
// 	showPerson(&person) //person: {1 kite}
// 	fmt.Println("-------------")
// 	fmt.Printf("person: %v\n", person) //person: {1 kite}
// }

//嵌套结构体
type Dog struct {
	name  string
	color string
	age   int
}
type Persong struct {
	dog  Dog
	name string
	age  int
}

func main() {
	//访问
	var tom Persong
	tom.dog.name = "滑滑"
	tom.dog.color = "yellow"
	tom.dog.age = 3

	tom.name = "tom"
	tom.age = 20
	fmt.Printf("tom: %v\n", tom) //tom: {{滑滑 yellow 3} tom 20}
}
